const axios = require('axios');

// 配置基础 URL - 这里假设 admin 服务运行在 3001 端口
const BASE_URL = 'http://localhost:3001';

// 测试数据
const testPost = {
  title: '管理员测试文章',
  slug: 'admin-test-post-' + Date.now(),
  excerpt: '这是一个管理员创建的测试文章摘要',
  content: '这是管理员测试文章的内容，用于验证后台管理系统的 API 功能是否正常工作。包含了完整的字段测试。',
  status: 'draft',
  author: {
    id: 1,
    username: 'admin',
    nickname: '系统管理员',
    email: 'admin@example.com',
    role: 'admin'
  },
  authorId: 1,
  category: {
    id: 1,
    name: '系统公告'
  },
  categoryId: 1,
  tags: [
    { id: 1, name: '管理' },
    { id: 2, name: '测试' },
    { id: 3, name: 'API' }
  ],
  featuredImage: 'https://example.com/admin-test-image.jpg',
  metaTitle: '管理员测试文章 - SEO 标题',
  metaDescription: '这是管理员测试文章的 SEO 描述，用于搜索引擎优化',
  metaKeywords: '管理,测试,API,后台',
  isTop: false,
  allowComment: true,
  language: 'zh-CN'
};

// 模拟 JWT token - 实际使用时需要先登录获取
let authToken = '';

async function login() {
  try {
    console.log('🔐 尝试登录获取认证令牌...');
    // 这里需要根据你的认证接口调整
    const loginResponse = await axios.post(`${BASE_URL}/auth/login`, {
      username: 'admin',
      password: 'admin123'
    });
    
    authToken = loginResponse.data.data.access_token;
    console.log('✅ 登录成功，获取到认证令牌');
    return authToken;
  } catch (error) {
    console.log('⚠️  登录失败，将使用模拟令牌进行测试');
    // 如果登录失败，使用模拟令牌
    authToken = 'mock-jwt-token';
    return authToken;
  }
}

// 设置请求拦截器添加认证头
function setupAxiosInterceptors() {
  axios.interceptors.request.use(
    (config) => {
      if (authToken) {
        config.headers.Authorization = `Bearer ${authToken}`;
      }
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );
}

async function testAdminPostsAPI() {
  try {
    console.log('🚀 开始测试 Admin Posts API...\n');

    // 先尝试登录
    await login();
    setupAxiosInterceptors();

    // 1. 测试创建文章
    console.log('1. 测试创建文章...');
    const createResponse = await axios.post(`${BASE_URL}/posts`, testPost);
    const createdPost = createResponse.data.data;
    console.log('✅ 文章创建成功，ID:', createdPost.id);
    console.log('   标题:', createdPost.title);
    console.log('   状态:', createdPost.status);
    console.log('   作者:', createdPost.author.username);

    // 2. 测试获取文章列表
    console.log('\n2. 测试获取文章列表...');
    const listResponse = await axios.get(`${BASE_URL}/posts?page=1&limit=5`);
    const listData = listResponse.data.data;
    console.log('✅ 获取文章列表成功');
    console.log('   总数:', listData.total);
    console.log('   当前页文章数:', listData.posts.length);

    // 3. 测试根据 ID 获取文章
    console.log('\n3. 测试根据 ID 获取文章...');
    const getResponse = await axios.get(`${BASE_URL}/posts/${createdPost.id}`);
    const fetchedPost = getResponse.data.data;
    console.log('✅ 获取文章详情成功');
    console.log('   标题:', fetchedPost.title);
    console.log('   浏览次数:', fetchedPost.viewCount);
    console.log('   阅读时间:', fetchedPost.readingTime, '分钟');

    // 4. 测试更新文章
    console.log('\n4. 测试更新文章...');
    const updateData = {
      title: '更新后的管理员测试文章',
      status: 'published',
      isTop: true
    };
    const updateResponse = await axios.patch(`${BASE_URL}/posts/${createdPost.id}`, updateData);
    const updatedPost = updateResponse.data.data;
    console.log('✅ 文章更新成功');
    console.log('   新标题:', updatedPost.title);
    console.log('   新状态:', updatedPost.status);
    console.log('   是否置顶:', updatedPost.isTop);
    console.log('   发布时间:', updatedPost.publishedAt);

    // 5. 测试发布文章
    console.log('\n5. 测试发布文章...');
    const publishResponse = await axios.patch(`${BASE_URL}/posts/${createdPost.id}/publish`);
    const publishedPost = publishResponse.data.data;
    console.log('✅ 文章发布成功');
    console.log('   状态:', publishedPost.status);

    // 6. 测试归档文章
    console.log('\n6. 测试归档文章...');
    const archiveResponse = await axios.patch(`${BASE_URL}/posts/${createdPost.id}/archive`);
    const archivedPost = archiveResponse.data.data;
    console.log('✅ 文章归档成功');
    console.log('   状态:', archivedPost.status);

    // 7. 测试搜索功能
    console.log('\n7. 测试搜索功能...');
    const searchResponse = await axios.get(`${BASE_URL}/posts?search=管理员&status=archived`);
    const searchData = searchResponse.data.data;
    console.log('✅ 搜索功能测试成功');
    console.log('   搜索结果数:', searchData.posts.length);

    // 8. 测试批量操作
    console.log('\n8. 测试批量操作...');
    const batchResponse = await axios.post(`${BASE_URL}/posts/batch`, {
      action: 'draft',
      postIds: [createdPost.id]
    });
    console.log('✅ 批量操作成功');
    console.log('   影响的文章数:', batchResponse.data.data.affected);

    // 9. 测试获取已发布文章
    console.log('\n9. 测试获取已发布文章...');
    const publishedResponse = await axios.get(`${BASE_URL}/posts/published?page=1&limit=5`);
    const publishedData = publishedResponse.data.data;
    console.log('✅ 获取已发布文章成功');
    console.log('   已发布文章数:', publishedData.posts.length);

    // 10. 测试删除文章
    console.log('\n10. 测试删除文章...');
    await axios.delete(`${BASE_URL}/posts/${createdPost.id}`);
    console.log('✅ 文章删除成功');

    console.log('\n🎉 所有测试通过！Admin Posts API 工作正常。');
    console.log('\n📝 测试总结:');
    console.log('   - ✅ 文章 CRUD 操作');
    console.log('   - ✅ 状态管理（发布/归档/草稿）');
    console.log('   - ✅ 搜索和过滤功能');
    console.log('   - ✅ 批量操作功能');
    console.log('   - ✅ 分页功能');
    console.log('   - ✅ 认证保护');

  } catch (error) {
    console.error('❌ 测试失败:', error.response?.data || error.message);
    if (error.response?.status === 401) {
      console.error('   认证失败，请检查 JWT 令牌或登录接口');
    }
    if (error.response?.data) {
      console.error('   错误详情:', JSON.stringify(error.response.data, null, 2));
    }
  }
}

// 运行测试
if (require.main === module) {
  testAdminPostsAPI();
}

module.exports = { testAdminPostsAPI };
